package api

import (
	"fmt"
	"service/app/control"
	"service/app/dto"

	"github.com/gin-gonic/gin"
)

var (
	MENUS_ADD    = 300001
	MENUS_DEL    = 300002
	MENUS_UPDATA = 300003
	MENUSBYID    = 300004
)

type MenuApi struct {
	BaseApi
	Cont *control.MenusCont
}

func MenuApiCreate() MenuApi {
	return MenuApi{
		BaseApi: *BaseApi{}.BaseApiInit(),
		Cont:    control.MenuControlInit(),
	}
}

// @Summary 获取menus列表从 ids []
// @Description
// @Security ApiKeyAuth
// @Router /api/v1/menu/byids [post]
// @Tags menus
// @Param object body dto.ImenuList_updata true "menus结构体"
// @Success 200 {object} ResponseJson "成功"
func (m MenuApi) MenusById(ctx *gin.Context) {
	var ids dto.ImenuList_updata
	if err := m.BaseReqHandle(&IBaseApiParams{Ctx: ctx, Dto: ids, Valid: true}).GetBaseErr(); err != nil {
		m.Fail(ResponseJson{Msg: err.Error()})
		return
	}
	list, err := m.Cont.MenusByIdsC(&ids)
	if err != nil {
		m.Fail(ResponseJson{Msg: err.Error(), Code: MENUSBYID})
		return
	}
	m.Okay(ResponseJson{Msg: "获取menus列表成功", Data: list})
}

// @Summary 创建menus ,
// @Description  接受的 path时是前端提交后端地址
// @Security ApiKeyAuth
// @Router /api/v1/menu/add [post]
// @Tags menus
// @Param object body dto.ImenusAdd true "menus结构体"
// @Success 200 {object} ResponseJson "成功"
func (m MenuApi) MenuAdd(ctx *gin.Context) {
	var param dto.ImenusAdd
	if err := m.BaseApi.BaseReqHandle(&IBaseApiParams{Ctx: ctx, Dto: &param}).GetBaseErr(); err != nil {
		m.Fail(ResponseJson{Msg: err.Error()})
		return
	}
	if err := m.Cont.MenuAdd(&param); err != nil {
		m.Fail(ResponseJson{Msg: fmt.Sprintf("添加菜单错误,%v", err.Error()), Code: MENUS_ADD})
		return
	}
	m.Okay(ResponseJson{Msg: fmt.Sprintf("创建menu %s 成功", param.Name)})
}

func (m MenuApi) MenuAddList(ctx *gin.Context) {
	var param dto.Imenulist_Add
	if err := m.BaseApi.BaseReqHandle(&IBaseApiParams{Ctx: ctx, Dto: &param}).GetBaseErr(); err != nil {
		m.Fail(ResponseJson{Msg: err.Error()})
		return
	}
	if err := m.Cont.MenuAddListC(&param); err != nil {
		m.Fail(ResponseJson{Msg: err.Error(), Code: MENUS_ADD})
		return
	}
	m.Okay(ResponseJson{Msg: "创建menu成功"})
}

// @Tags menus
// @Summary 获取所有menus列表
// @Description 获取所有menus列表
// @Router /api/v1/menu [GET]
// @Security Bearer
func (m MenuApi) MenuAllGet(ctx *gin.Context) {
	m.Ctx = ctx
	list, err := m.Cont.MenuGetAll()
	if err != nil {
		m.Fail(ResponseJson{Msg: "查询menus列表失败"})
		return
	}
	m.Okay(ResponseJson{Msg: "获取menus列表成功", Data: list})
}

// @Tags menus
// @Summary 删除menu by id
// @Description  删除menu by id
// @Security ApiKeyAuth
// @Router /api/v1/menu [DELETE]
// @Param object query dto.ReqIdDto false "用户ID" maxlength(100)
// @Success 200 {object} ResponseJson "成功"
func (m MenuApi) MenuRm(ctx *gin.Context) {
	var id dto.ReqIdDto
	if err := m.BaseReqHandle(&IBaseApiParams{Ctx: ctx, ReqQey: true, Dto: &id}).GetBaseErr(); err != nil {
		m.Fail(ResponseJson{Msg: err.Error()})
		return
	}
	if err := m.Cont.MenuDel(&id); err != nil {
		m.Fail(ResponseJson{Msg: err.Error(), Code: MENUS_DEL})
		return
	}
	m.Okay(ResponseJson{Msg: fmt.Sprintf("删除%v成功!", id.Id)})
}

// @Tags menus
// @Summary 修改menu by id
// @Description  修改menu by id
// @Router /api/v1/menu/{id} [PUT]
// @Param id path int true "muenID"
// @Security ApiKeyAuth
func (m MenuApi) MenuEdit(ctx *gin.Context) {
	var id dto.ReqUriIdDto
	var param dto.ImenusAdd
	if err := m.BaseReqHandle(&IBaseApiParams{Ctx: ctx, ReqUri: true, Dto: &id}).GetBaseErr(); err != nil {
		m.Fail(ResponseJson{Msg: err.Error()})
		return
	}
	if err := m.BaseReqHandle(&IBaseApiParams{Ctx: ctx, Dto: &param}).GetBaseErr(); err != nil {
		m.Fail(ResponseJson{Msg: err.Error()})
		return
	}
	if err := m.Cont.MenuEditC(id.Id, &param); err != nil {
		m.Fail(ResponseJson{Code: MENUS_UPDATA, Msg: err.Error()})
	}
	m.Okay(ResponseJson{Msg: fmt.Sprintf("修改 %v menu %v", id.Id, param)})
}

// @Tags menus
// @Summary 查看有path menu
// @Description  查看有path menu
// @Router /api/v1/menu/havepath [GET]
// @Security ApiKeyAuth
// func (m *MenuApi) MenuHavePath(ctx *gin.Context) {
// 	m.Ctx = ctx
// 	m.Cont.MenuPath()
// 	m.Okay(ResponseJson{Msg: "获取已分配url的menu成功"})
// }
